package com.tcoiss.webservice.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;


public class GetLength {
    private static final Logger logger = LoggerFactory.getLogger(GetLength.class);


    // 编码方式
    private static final String ENCODE_UTF = "UTF-8";


    /**
     * 计算中英文字符串的字节长度 <br/>
     * 一个中文占3个字节
     *
     * @param str
     * @return int 字符串的字节长度
     */
    public static int getLength(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        try {
            return str.getBytes(ENCODE_UTF).length;
        } catch (UnsupportedEncodingException e) {
            logger.error("计算中英文字符串的字节长度失败，", e);
        }
        return 0;
    }




    /**
     * 计算中英文字符串的字节长度
     *
     * @param str
     * @return int
     */
    public static int getStrLength(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        int len = 0;
        for (int i = 0, j = str.length(); i < j; i++) {
            //UTF-8编码格式中文占三个字节，GBK编码格式 中文占两个字节 ;
            len += (str.charAt(i) > 255 ? 3 : 1);
        }
        return len;
    }

    public static String substringByByteLength(String orignal, int count) {
        if(orignal != null && !"".equals(orignal)){
            int tmp = count;
            try {
                orignal = new String(orignal.getBytes(ENCODE_UTF),ENCODE_UTF);
                System.out.println(orignal.getBytes(ENCODE_UTF).length);
                if(tmp > 0 && tmp < orignal.getBytes(ENCODE_UTF).length){
                    StringBuffer buff = new StringBuffer();
                    char c;
                    for(int i = 0; i < tmp; i++){
                        c = orignal.charAt(i);
                        if((buff.toString() + String.valueOf(c)).getBytes(ENCODE_UTF).length <= count ){
                            buff.append(c);
                        }
//                        if(isChinese(c)){
//                            --tmp; //遇到中文汉字，截取字节总数减1
//                        }
                    }
                    return buff.toString();
                }
                return orignal;
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return "";

    }

    public static String bSubstring(String s, int length) throws Exception
    {

        byte[] bytes = s.getBytes("Unicode");
        int n = 0; // 表示当前的字节数
        int i = 2; // 要截取的字节数，从第3个字节开始
        for (; i < bytes.length && n < length; i++)
        {
            // 奇数位置，如3、5、7等，为UCS2编码中两个字节的第二个字节
            if (i % 2 == 1)
            {
                n++; // 在UCS2第二个字节时n加1
            }
            else
            {
                // 当UCS2编码的第一个字节不等于0时，该UCS2字符为汉字，一个汉字算两个字节
                if (bytes[i] != 0)
                {
                    n++;
                }
            }
        }
        // 如果i为奇数时，处理成偶数
        if (i % 2 == 1)

        {
            // 该UCS2字符是汉字时，去掉这个截一半的汉字
            if (bytes[i - 1] != 0)
                i = i - 1;
                // 该UCS2字符是字母或数字，则保留该字符
            else
                i = i + 1;
        }

        return new String(bytes, 0, i, "Unicode");
    }

    public static boolean isChinese(char ch) {
        //获取此字符的UniCodeBlock
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(ch);
        //  GENERAL_PUNCTUATION 判断中文的“号
        //  CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号
        //  HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的，号
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
            return true;
        }
        return false;
    }


//    public static void main(String[] args) throws Exception {
//        String str = "【56寸及以上】-彩电底座支";
//        String string = bSubstring(str,25);
//        System.out.println(getLength(str));
//        System.out.println(getStrLength(string));
//        System.out.println(string);
//    }

}
